// funkcja do obsługi przeciwników i innych postaci,

// startX - startowa wartość dla X (int)
// startY - startowa wartość dla Y (int)
// atrybuty - parametry postaci, obrazek (dict)
var Enemy = function(start, atrybuty) {

    // x - aktualna pozycja X
    var x = start[0];
    // y - aktualna pozycja Y
    var	y = start[1];

    // o ile ma się wykonać ruch
    var dx = 0;
    var dy = 0;

    // jaka jest odległość od gracza
    var pdx = 0;
    var pdy = 0;

    var nazwa = atrybuty.nazwa;

    // witalność wpływa na życie
    var witalnosc = atrybuty.witalnosc;
    var zycie = witalnosc * 10;
    var wczesniejZycie = zycie;

    // obrazek
    var image = IMG[nazwa];

    // pozycja na obrazku (dla wytworzenia animacji)
    var xPos = 0;
    var yPos = 0;

    // wielkości klatek animacji
    var frameW = image.width  / 4;
    var frameH = image.height / 4;

    // czy w danym wywołaniu ma być wykonywany ruch
    var ruch = false;

    // funkcja rysująca
    var draw = function(ctx, offX, offY) {

        // wielkości klatek animacji
        frameW = image.width  / 4;
        frameH = image.height / 4;

        //
        var oX = x - offX;
        var oY = y - offY;

        // rysowanie odpowiedniej klatki
        // image - obrazek
        // xPos, yPos - pozycja na obrazku
        // frameW, frameH - szerokość i wysokość wybierajnej klatki
        // x, y - pozycja na canvasie (czyli gdzie dany obrazek ma być narysowny
        ctx.drawImage(image, xPos, yPos, frameW, frameH, oX, oY, frameW, frameH);

        // jeśli nie ma być wykonanego ruchu to wychodzimy
        if (!ruch) {
            return;
        }

        // przechodzimy do następnej klatki
        xPos += frameW;

        // dy - o ile ma być wykonany ruch na współrzędnej Y
        // pdx - odległość od gracza na wsp X
        // pdy - odległość od gracza na wsp Y

        // jeśli wyszliśmy poza zakres klatki, to musimy przeskoczyć na początek

        if (xPos + frameW > image.width){

            // w zależności od kierunki w jakim idziemy wybierana
            // jest odpowiednia opcja

            // jeśli ruch jest w dół i odległość na wsp Y jest większa niż na X (Y ma priorytet)
            if (dy > 0 && pdy > pdx) {

                xPos = 0;
                yPos = 0;

                if (nazwa === "smok") {
                    ctx.drawImage(IMG.dragonFireball, oX + 35, oY + 95);
                    ctx.drawImage(IMG.dragonFireball, oX + 35, oY + 115);

                }
            }

            // jeśli ruch jest do góry i odległość na wsp Y jest większa niż na X (Y ma priorytet)
            else if (dy < 0 && pdy > pdx) {

                xPos = 0;
                yPos = 3 * frameH;

                if (nazwa === "smok") {
                    ctx.drawImage(IMG.dragonFireball, oX + 35, oY - 40);
                    ctx.drawImage(IMG.dragonFireball, oX + 35, oY - 65);

                }
            }

            // jeśli ruch jest w prawo
            else if (dx > 0) {

                xPos = 0;
                yPos = 2 * frameH;

                if (nazwa === "smok") {
                    ctx.drawImage(IMG.dragonFireball, oX +  95, oY + 35);
                    ctx.drawImage(IMG.dragonFireball, oX + 115, oY + 35);

                }
            }

            // jeśli ruch jest w lewo
            else if (dx < 0) {

                xPos = 0;
                yPos = frameH;

                if (nazwa === "smok") {
                    ctx.drawImage(IMG.dragonFireball, oX - 40, oY + 35);
                    ctx.drawImage(IMG.dragonFireball, oX - 60, oY + 35);

                }
            }
        }


    };

    // zwraca aktualny obrazek
    var img = function() {

        return image;
    };

    // sprawdza czy postać jest ciągle żywa
    var alive = function() {

        return (zycie > 0);
    };

    function wyswietlPasekZycia() {
        $("#enemyHP").html("Zycie: " + zycie + "/" + (witalnosc * 10) + "");
    }

    // funkcja obniżająca punkty życia o step
    var loseHP = function(silaGracza) {

        var strataZycia = (silaGracza / 2) | 0;
        wczesniejZycie = zycie;
        zycie -= strataZycia;


        wyswietlPasekZycia();
        
		// sprawdza czy przeciwnik akurat stracił życie
         return wczesniejZycie > 0.1 && zycie < 0.1;
    };

    // ustawia wartości potrzebne do wykonania ruchu
    // dx - o ile ma się ruszyć na wsp X
    // dy - o ile ma się ruszyć na wsp Y
    // pdx - odległość od gracza na wsp X
    // pdy - odległość od gracza na wsp Y (jeśli ruch jest na skos, to animacja jest w tą stronę, gdzie ta wartość
    // jest większa
    function setMove(moveData) {

        x = moveData[0];
        y = moveData[1];
        dx = moveData[2];
        dy = moveData[3];
        pdx = moveData[4];
        pdy = moveData[5];

        //console.log("X");
        //console.log(x);

        // ustawiamy ruch na true tylko wtedy kiedy faktycznie jest konieczność ruchu
        ruch = (dx > 0 || dy > 0);
    }

    // ustawiamy pozycję
    function setPos(x_, y_) {

        x = x_;
        y = y_;
    }

    // pobieramy pozycję
    function getPos() {

        return [x, y];
    }

    function ustawZycie(wartosc) {
        zycie = wartosc;
        console.log(zycie);
    }

    function ileZycia() {
        return zycie;
    }

    function jakiRodzaj() {
        return nazwa;
    }

    return {
        draw: draw,
        img: img,
        loseHP: loseHP,
        alive: alive,
        x : x,
        y : y,
        jakiRodzaj : jakiRodzaj,

        setPos : setPos,
        getPos : getPos,

        setMove : setMove,

        ustawZycie : ustawZycie,

        ileZycia : ileZycia,

        wyswietlPasekZycia : wyswietlPasekZycia
    }
};